package com.zxl.jdk8test;

import java.time.Clock;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * Java 8 在包java.time下包含了一组全新的时间日期API。
 * 新的日期API和开源的Joda-Time库差不多，但又不完全一样，
 * 下面的例子展示了这组新API里最重要的一些部分：
 * @author zxl
 *
 */
public class DateApiTest {
    
    public static void main(String[] args) {
        
        LocalDate lendDate = LocalDate.parse("12/31/2016", DateTimeFormatter.ofPattern("MM/dd/yyyy"));
        lendDate.plusDays(2l);
        LocalDate now = LocalDate.now();
        ZoneId zoneId = ZoneId.systemDefault();
        Date date = Date.from(now.atStartOfDay(zoneId).toInstant());
        System.out.println(date + "     " + date.getTime() );
        
        
        Calendar endDate = Calendar.getInstance();
        endDate.set(2017, 0, 1, 0, 0, 0);
        endDate.set(Calendar.MILLISECOND, 0);
        Calendar cnow = Calendar.getInstance();
        cnow.set(2016, 10, 15, 0, 0, 0);
        cnow.add(Calendar.DAY_OF_YEAR, 2);
        cnow.set(Calendar.MILLISECOND, 0);
//        Calendar.day
        System.out.println("endDate：" + endDate.getTime() + "    " + endDate.getTimeInMillis());
        System.out.println("cnow   ：" + cnow.getTime() + "    " + cnow.getTimeInMillis());
        System.out.println(cnow.getTimeInMillis() >= endDate.getTimeInMillis());
        
        
        
        
//        clockTest();
//        timezonesTest();
    }
    
    /**
     * Clock类提供了访问当前日期和时间的方法，Clock是时区敏感的，
     * 可以用来取代 System.currentTimeMillis() 来获取当前的微秒数。
     * 某一个特定的时间点也可以使用Instant类来表示，Instant类也可以用来创建老的java.util.Date对象。
     */
    public static void clockTest(){
        Clock clock = Clock.systemDefaultZone();
        long millis = clock.millis();// System.currentTimeMillis().
        System.out.println(millis);
        Instant instant = clock.instant();
        Date date = Date.from(instant);
        System.out.println(date.getTime());
    }
    
    /**
     * 在新API中时区使用ZoneId来表示。时区可以很方便的使用静态方法of来获取到。
     * 时区定义了到UTS时间的时间差，在Instant时间点对象到本地日期对象之间转换的时候是极其重要的
     */
    public static void timezonesTest(){
        LocalDate parse = LocalDate.parse("2015/06/12", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        System.out.println(parse.getDayOfMonth());
        ZoneId zoneId = ZoneId.of("Europe/Berlin");
        System.out.println(zoneId.getId());
        System.out.println(zoneId.getRules());
    }
    
}
